// Web workers Referenz fuer Physijs zur Nutzung in Hintergrund-Thread
Physijs.scripts.worker = 'libs/physijs_worker.js';
// Link zur intern verwendeten Ammo.js-Library
Physijs.scripts.ammo = '../libs/ammo.js';

var render_stats;

var szene;
var fahrbahn;
var light;
var kameraPerspektiv;

var kameraOrthogonal, szeneOrthogonal;
var spriteLenkrad;

// Blinker links aktiv?
var blinker_links = false;
// Blinker rechts aktiv?
var blinker_rechts = false;

var blinkerSeiteSprite_links;
var blinkerSeiteSprite_rechts;
var blinkerHintenSprite_links;
var blinkerHintenSprite_rechts;
var blinkerVorneSprite_links;
var blinkerVorneSprite_rechts;

// var gui;
var antrieb;

var strassenElementAnzahl = 20;

var length = 100;
var fahrbahnBreite = 25;

var queueFahrbahn = new Array();
var queueTriggerAussenLinks = new Array();
var queueTriggerAussenRechts = new Array();
var queueStatischeUmgebung = new Array();

var queueTriggerLinks = new Array();
var queueTriggerMitte = new Array();
var queueTriggerRechts = new Array();

var laneAssistMindestGeschwindigkeit = false;

//var spurwechsel = false;

var modusFrueh = false;
var modusSpaet = false;
var modusLenkradvibration = false;
var vibrieren = false;
var vibrationsZaehler = 0;

var effect;

// Tastatureingaben
var beschleunigenInterval;

function init() {

	// Globalen Namespace schaffen
	window.laneAssist = {};
	laneAssist.fensterBreite = document.getElementById("viewport").clientWidth;
	laneAssist.fensterHoehe = document.getElementById("sidebar1").clientHeight;
	laneAssist.vollbild = false;

	laneAssist.renderer = new renderer();

	gui();

	// Audi Active Lane Assist aktiv?
	laneAssist.laneAssistAktiv = false;
	laneAssist.manager = new THREE.LoadingManager();
	console.log(laneAssist.manager);

	laneAssist.manager.onProgress = function(item, loaded, total) {
		console.log("Fuuu");
		console.log(item, loaded, total);
	};

	laneAssist.loader = new THREE.JSONLoader(laneAssist.manager);
	laneAssist.fahrzeug = new fahrzeug();

	laneAssist.fahrzeug.geschwindigkeit = 0;
	laneAssist.fahrzeug.radEinschlag = 0;
	laneAssist.fahrzeug.hoechstGeschwindigkeit = -100;

	laneAssist.skybox = new skybox();
	laneAssist.hemisphaerenLicht = new hemisphaerenLicht();
	laneAssist.verfolgerLicht = new verfolgerLicht();
	laneAssist.aufhellLicht = new aufhellLicht();

	// Eingabemoeglichkeiten
	laneAssist.leapMotionSteuerungAktiv = false;
	laneAssist.leapMotionSteuerungPosition

	// Sound
	laneAssist.ambientSound = document.createElement("audio");
	laneAssist.soundAn = true;

	// Postprocessing
	laneAssist.postProcessing = false;
	laneAssist.composer
	laneAssist.anaglyph = false;

	document.getElementById('viewport').appendChild(laneAssist.renderer.domElement);
	window.onresize = onWindowResize;

	// Three.js-Hilfsmittel zur Zeiterfassung
	laneAssist.clock = new THREE.Clock();
	keyEventSetup();

	$(window).resize(function() {
		onWindowResize();
	});

	// Anzeige zur Kontrolle der Performance des Rendering erstellen, positionieren, anhaengen
	render_stats = new Stats();
	render_stats.domElement.style.position = 'absolute';
	render_stats.domElement.style.top = '1px';
	render_stats.domElement.style.left = '1px';
	render_stats.domElement.style.zIndex = 100;
	document.getElementById('viewport').appendChild(render_stats.domElement);

	kameraOrthogonal = new THREE.OrthographicCamera(-laneAssist.fensterBreite / 2, laneAssist.fensterBreite / 2, laneAssist.fensterHoehe / 2, -laneAssist.fensterHoehe / 2, 1, 10);
	kameraOrthogonal.position.z = 10;
	szeneOrthogonal = new THREE.Scene();
	var mapA = THREE.ImageUtils.loadTexture("assets/textures/general/lenkrad.png", undefined, erstelleHUDSprites);

	// szene als Physijs-szene erstellen
	szene = new Physijs.Scene({
		// Speichert die Objektdaten und sollte zu Performancezwecken auf Objektzahl reduziert werden
		reportSize : 15,
		// Einflussgroesser zur Berrechnungszeit der Physik. Kleinerer Wert, genaueres Ergebnis, schlechtere Performance
		fixedTimeStep : 1 / 240
	});

	// Schwerkraft in -Y ggf. auf Vorlagedaten anpassen
	szene.setGravity(new THREE.Vector3(0, -60, 0));

	szene.fog = new THREE.FogExp2(0xaaaabb, 0.00025);

	// Kamera mit Brennweite, Seitenverhaeltniss, Near- und Far-Plane
	kameraPerspektiv = new THREE.PerspectiveCamera(35, laneAssist.fensterBreite / laneAssist.fensterHoehe, 1, 10000);
	// Anfangsposition der Kamera (Fahrzeugverfolgung ueberschreibt entsprechend)
	kameraPerspektiv.position.set(45, 12.5, 15);
	szene.add(kameraPerspektiv);
	szene.add(laneAssist.verfolgerLicht);
	szene.add(laneAssist.aufhellLicht);
	szene.add(laneAssist.hemisphaerenLicht);
	szene.add(laneAssist.skybox);
	setupReflections();

	umgebung();
	hemisphaerenLicht();
	abschnittsTrigger();

	erstelleComposer();

	effect = new THREE.AnaglyphEffect(laneAssist.renderer);
	effect.setSize(laneAssist.fensterBreite, laneAssist.fensterHoehe);

	mausPosition();
	soundAmbience('ambience');
};

function onWindowResize() {
	laneAssist.fensterBreite = Math.round($("#viewport").width());
	laneAssist.fensterHoehe = ($(window).height() - $("#beschreibung").height() - $("#header").height());

	kameraPerspektiv.aspect = laneAssist.fensterBreite / laneAssist.fensterHoehe;
	kameraPerspektiv.updateProjectionMatrix();

	kameraOrthogonal.left = -laneAssist.fensterBreite / 2;
	kameraOrthogonal.right = laneAssist.fensterBreite / 2;
	kameraOrthogonal.top = laneAssist.fensterHoehe / 2;
	kameraOrthogonal.bottom = -laneAssist.fensterHoehe / 2;
	kameraOrthogonal.updateProjectionMatrix();

	spriteLenkrad.scale.set(laneAssist.fensterBreite * 0.25, laneAssist.fensterBreite * 0.25, 1);
	spriteLenkrad.position.set(-laneAssist.fensterBreite * 0.35, -laneAssist.fensterHoehe * 0.25, 1);
	laneAssist.renderer.setSize(laneAssist.fensterBreite, laneAssist.fensterHoehe);
	effect.setSize(laneAssist.fensterBreite, laneAssist.fensterHoehe);

};

/* Materialien aus der angefertigten Standardbibliothek, die zusätzliche szenenabhaengige Ressourcen erfordern,
 werden in dieser Funktion initialisiert.*/
function setupReflections() {
	pChromeT.envMap = cubeMap;
	pBlackGlasT.envMap = cubeMap;
	pSilverBlueCarPaintT.envMap = cubeMap;
}

function mausPosition() {
	$('#viewport').mousemove(function(e) {
		laneAssist.mausPositionX = ((e.pageX - $('#viewport').offset().left) - laneAssist.fensterBreite / 2) * 0.05;
		laneAssist.mausPositionY = (e.pageY - $('#viewport').offset().top) * 0.025;
	});
}

/* Mit Bewegungsfortschritt neue Umgebungsgeometrie erzeugen*/
function aktualisiere() {

	if (modusLenkradvibration && vibrieren) {
		lenkradVibration();
		vibrationsZaehler++;
	}

	// skyBox bewegt sich mit dem Fahrzeug mit um nicht zu enden
	laneAssist.skybox.position.x = karosserieDummy.position.x;

	// Licht
	verfolgerLicht.position.set(karosserieDummy.position.x, 80, karosserieDummy.position.z + 100);
	verfolgerLicht.target.position.set(karosserieDummy.position.x, 0, karosserieDummy.position.z);
	aufhellLicht.position.set(karosserieDummy.position.x - 20, 50, karosserieDummy.position.z - 25);
	aufhellLicht.target.position.set(karosserieDummy.position.x, 0, karosserieDummy.position.z);

	geschwindigkeitsKontrolle();

	if (laneAssist.leapMotionSteuerungAktiv) {
		if (laneAssist.leapMotionSteuerungPosition < -0.25) {
			console.log("links");
			laneAssist.fahrzeug.radEinschlag = -laneAssist.leapMotionSteuerungPosition;
		antrieb.aktualisiereRadEinschlag();			
			// blinker_links = true;
			// blinker_rechts = false;
		} else if (laneAssist.leapMotionSteuerungPosition > 0.25) {
			console.log("rechts");
			laneAssist.fahrzeug.radEinschlag = -laneAssist.leapMotionSteuerungPosition;
		antrieb.aktualisiereRadEinschlag();			
			// blinker_links = false;
			// blinker_rechts = true;
		} else {
			console.log(laneAssist.leapMotionSteuerungPosition);
						laneAssist.fahrzeug.radEinschlag = laneAssist.leapMotionSteuerungPosition;
		antrieb.aktualisiereRadEinschlag();	
		}
	}

	TWEEN.update();
	
	if (blinker_links) {
		laneAssist.fahrzeug.radEinschlag += 0.002;
		antrieb.aktualisiereRadEinschlag();
	}
	if (blinker_rechts) {
		laneAssist.fahrzeug.radEinschlag -= 0.002;
		antrieb.aktualisiereRadEinschlag();
	}

	antrieb.aktualisiereGeschwindigkeit();

	// Cameraposition auf Hoehe des Fahrzeugs
	kameraPerspektiv.position.x = karosserieDummy.position.x - 35 + laneAssist.fahrzeug.geschwindigkeit * 0.25;
	kameraPerspektiv.position.z = karosserieDummy.position.z + 10 + laneAssist.mausPositionX * 0.5;
	kameraPerspektiv.position.y = laneAssist.mausPositionY * 0.5 + 7;
	// Camerafokus auf Fahrzeug
	kameraPerspektiv.lookAt(new THREE.Vector3(karosserieDummy.position.x, 0, karosserieDummy.position.z));

	// Udate der dat.GUI-Controller
	for (var i in laneAssist.gui.__controllers) {
		laneAssist.gui.__controllers[i].updateDisplay();
	}
}

/*Renderloop der Anwenung*/
function render() {

	requestAnimationFrame(render);

	// Status (FPS oder MS) updaten
	render_stats.update();
	updateHUDSprites();
	// Verstrichene Zeit messen
	var delta = laneAssist.clock.getDelta();
	// Mit Bewegungsfortschritt neue Umgebungsgeometrie erzeugen
	aktualisiere();

	/* Aufruf an Physijs Position, Rotation seiner Objekte zu aktualisieren
	 * Undefined legt dabei fest, dass soviel simuliert werden soll wie moeglich,
	 * maximal aber ueber die danach angegebenen 2 Iterationen.*/
	szene.simulate(undefined, 2);

	if (!laneAssist.postProcessing) {

		if (laneAssist.anaglyph) {
			effect.render(szene, kameraPerspektiv);
			laneAssist.renderer.clear(false, false, false);
			laneAssist.renderer.render(szeneOrthogonal, kameraOrthogonal);
			// clear(color, depth, stencil)
			// effect.render(szeneOrthogonal, kameraOrthogonal);
		} else {
			laneAssist.renderer.render(szene, kameraPerspektiv);
			// (color, depth, stencil)
			laneAssist.renderer.render(szeneOrthogonal, kameraOrthogonal);
		}
	} else {
		laneAssist.composer.render();
		laneAssist.renderer.clear(false, true, false);
		laneAssist.renderer.render(szeneOrthogonal, kameraOrthogonal);
	}
};

